/**
 * 游戏地图类
 * 负责管理地图网格和障碍物
 */
class GameMap {
    /**
     * @param {number} width - 地图宽度（格子数）
     * @param {number} height - 地图高度（格子数）
     * @param {number} cellSize - 每个格子的像素大小
     */
    constructor(width, height, cellSize) {
        this.width = width;
        this.height = height;
        this.cellSize = cellSize;
        // 创建二维数组表示地图网格，0表示可通行
        this.grid = Array(height).fill().map(() => Array(width).fill(0));
        // 存储移动障碍物
        this.movingObstacles = [];
        
        // 初始化地图障碍物
        this.initializeObstacles();
    }

    /**
     * 初始化地图上的静态和移动障碍物
     */
    initializeObstacles() {
        // 添加静态障碍物，覆盖地图20%的面积
        for (let i = 0; i < this.width * this.height * 0.2; i++) {
            const x = Math.floor(Math.random() * this.width);
            const y = Math.floor(Math.random() * this.height);
            // 70%概率生成普通障碍物(1)，30%概率生成特殊类型障碍物(2-5)
            this.grid[y][x] = Math.random() < 0.7 ? 1 : 
                             Math.floor(Math.random() * 4) + 2;
        }

        // 添加5个移动障碍物
        for (let i = 0; i < 5; i++) {
            const isRectangle = Math.random() < 0.5;
            const obstacle = new MovingObstacle(
                Math.random() * (this.width - 4) * this.cellSize,
                Math.random() * (this.height - 4) * this.cellSize,
                isRectangle ? 2 : 1,  // 宽度：2格或1格
                isRectangle ? 2 : 4,  // 高度：2格或4格
                this.cellSize
            );
            this.movingObstacles.push(obstacle);
        }
    }

    /**
     * 更新地图状态
     * 主要处理移动障碍物的位置更新
     */
    update() {
        // 清除移动障碍物的旧位置
        for (let y = 0; y < this.height; y++) {
            for (let x = 0; x < this.width; x++) {
                if (this.grid[y][x] === 1) {
                    this.grid[y][x] = 0;
                }
            }
        }

        // 更新移动障碍物的新位置
        this.movingObstacles.forEach(obstacle => {
            obstacle.update(this.width * this.cellSize, this.height * this.cellSize);
            
            // 将移动障碍物的新位置更新到网格中，添加边界检查
            const gridX = Math.floor(obstacle.x / this.cellSize);
            const gridY = Math.floor(obstacle.y / this.cellSize);
            
            // 确保障碍物不会超出地图边界
            const startX = Math.max(0, gridX);
            const startY = Math.max(0, gridY);
            const endX = Math.min(this.width, gridX + obstacle.width);
            const endY = Math.min(this.height, gridY + obstacle.height);
            
            for (let dy = startY; dy < endY; dy++) {
                for (let dx = startX; dx < endX; dx++) {
                    this.grid[dy][dx] = 1;
                }
            }
        });
    }

    /**
     * 绘制地图
     * @param {CanvasRenderingContext2D} ctx - Canvas上下文
     */
    draw(ctx) {
        // 绘制所有网格中的障碍物
        for (let y = 0; y < this.height; y++) {
            for (let x = 0; x < this.width; x++) {
                const cell = this.grid[y][x];
                if (cell !== 0) {
                    ctx.fillStyle = this.getCellColor(cell);
                    ctx.fillRect(
                        x * this.cellSize,
                        y * this.cellSize,
                        this.cellSize,
                        this.cellSize
                    );
                }
            }
        }

        // 绘制移动障碍物
        this.movingObstacles.forEach(obstacle => obstacle.draw(ctx));
    }

    /**
     * 获取不同类型格子的颜色
     * @param {number} cellType - 格子类型（0-5）
     * @returns {string} - 对应的颜色值
     */
    getCellColor(cellType) {
        switch(cellType) {
            case 1: return '#666666'; // 移动障碍物
            case 2: return '#00FF00'; // 队友
            case 3: return '#8B4513'; // 建筑物
            case 4: return '#FF0000'; // 敌人
            case 5: return '#PURPLE'; // 其他
            default: return '#000000';
        }
    }
} 